package main

import (
	"fmt"
	"math/rand"
	"unsafe"
)

func main7() {
	// 利用随机字数字来组装字符串，使字符串的内容只能在运行期确定
	s := "abc" + string(rand.Intn(1))

	fmt.Println(rand.Intn(1))

	// 将内存地址转换为unsafe.Pointer
	pointer := unsafe.Pointer(&s)

	// 将unsafe.Pointer转换为uintptr指针，注意，此处不是uintptr。
	dataAddress := (*uintptr)(pointer)

	// 在字节数组内存地址的基础上，向高位地址偏移2，获得第二个字节的地址
	targetAddress := (*dataAddress) + 2

	// 将获得的字节地址，转换为unsafe.Pointer类型，从而向对象语义靠拢
	targetPointer := unsafe.Pointer(targetAddress)

	// 将unsafe.Pointer强制转换为字节指针
	bytePointer := (*byte)(targetPointer)

	// 通过字节指针的内容，尝试修改内容数据
	*bytePointer = 'd'

	fmt.Printf("修改后字符长度%d, 内容：%s\n", len(s), s)
}
